package org.jeecg.config;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.Notification;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class JpushConfig {
    /**
     * 极光推送的用户名
     */
    private static String appkey;
    /**
     * 极光推送的密码
     */
    private static String masterSecret;
    /**
     * 极光推送设置过期时间
     */
    private static String liveTime;

    @Value("${jpush.appKey}")
    public void setAppkey(String appkey) {
        JpushConfig.appkey = appkey;
    }

    public String getAppkey() {
        return appkey;
    }

    @Value("${jpush.liveTime}")
    public void setLiveTime(String liveTime) {
        JpushConfig.liveTime = liveTime;
    }

    public String getLiveTime() {
        return liveTime;
    }

    @Value("${jpush.masterSecret}")
    public void setMasterSecret(String masterSecret) {
        JpushConfig.masterSecret = masterSecret;
    }

    public String getMasterSecret() {
        return masterSecret;
    }

    public static PushResult sendPush(String title, String content, Map<String, String> extrasMap, String... tags) throws APIConnectionException, APIRequestException {
        ClientConfig clientConfig = ClientConfig.getInstance();
        clientConfig.setTimeToLive(Long.valueOf(liveTime));
        // 使用NativeHttpClient网络客户端，连接网络的方式，不提供回调函数
        JPushClient jpushClient = new JPushClient(masterSecret, appkey, null,
                clientConfig);
        // 设置推送方式
        PushPayload payload = buildPushLoadByTags(title, content, extrasMap, tags);
        PushResult result = jpushClient.sendPush(payload);
        return result;
    }

    /**
     * 根据标签推送相应的消息
     * @param title 推送消息标题
     * @param content 推送消息内容
     * @param map 推送额外信息
     * @param alias 推送的目标设备
     * @return
     */
    private static PushPayload buildPushLoadByTags(String title,String content,Map<String,String> map,String... alias) {
        if(null == map){
            map = new HashMap<>();
        }
        //批量删除数组中的空元素
        return PushPayload.newBuilder()
                //设置推送平台为安卓
                .setPlatform(Platform.android())
                //设置标签
                .setAudience(Audience.alias(alias))
                //设置 推送的标签标题
                // 设置通知方式(以alert方式提醒)
                .setNotification(Notification.newBuilder().setAlert(content)
                        .addPlatformNotification(AndroidNotification.newBuilder().setTitle(title).addExtras(map).build()).build())
                //sendno int 可选 推送序号 纯粹用来作为 API 调用标识
                //离线消息保留时长 推送当前用户不在线时，为该用户保留多长时间的离线消息(默认 86400 （1 天），最长 10 天。设置为 0 表示不保留离线消息，只有推送当前在线的用户可以收到)
                //apns_production boolean 可选 APNs是否生产环境  True 表示推送生产环境，False 表示要推送开发环境； 如果不指定则为推送生产环境
                //big_push_duration int 可选 定速推送时长（分钟） 又名缓慢推送，把原本尽可能快的推送速度，降低下来，在给定的 n 分钟内，均匀地向这次推送的目标用户推送。最大值为 1440。未设置则不是定速推送
//            .setOptions(Options.newBuilder().setApnsProduction(false).setTimeToLive(8600).setBigPushDuration(1).build())
                //设置通知内容
//            .setMessage(Message.newBuilder().setTitle("").setMsgContent("").setContentType("").build())
                .build();
    }

}
